﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.ДокументыСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.ДокументыСсылка
{
	///<summary>
	///(Упр)
	///</summary>
	[ProtoContract]
	[DataContract]
	public partial class ВнутреннееПеремещениеСредствПриБюджетировании:ДокументСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("151800f5-2b77-4edd-ba16-5cf3d5d2e04c");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928011957.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public DateTime Дата {get;set;}
		public DateTime ПрефиксНомера {get;set;}
		public string/*11*/ Номер {get;set;}
		public bool Проведен {get;set;}
		public V82.СправочникиСсылка.СценарииПланирования Сценарий {get;set;}
		public DateTime ПериодПланирования {get;set;}//Период планирования
		public V82.СправочникиСсылка.СтатьиОборотовПоБюджетам СтатьяОборотов {get;set;}//Статья оборотов
		public V82.СправочникиСсылка.КлассификаторЕдиницИзмерения ЕдиницаИзмеренияИсточник {get;set;}//Единица измерения источник
		public V82.СправочникиСсылка.КлассификаторЕдиницИзмерения ЕдиницаИзмеренияПриемник {get;set;}//Единица измерения приемник
		public V82.СправочникиСсылка.Подразделения ЦФОИсточник {get;set;}//ЦФО - источник
		public V82.СправочникиСсылка.Подразделения ЦФОПриемник {get;set;}//ЦФО - приемник
		public V82.СправочникиСсылка.Проекты ПроектИсточник {get;set;}//Проект - источник
		public V82.СправочникиСсылка.Проекты ПроектПриемник {get;set;}//Проект - приемник
		public V82.СправочникиСсылка.Контрагенты КонтрагентИсточник {get;set;}//Контрагент - источник
		public object НоменклатураИсточник {get;set;}//Номенклатура - источник
		public V82.СправочникиСсылка.Валюты ВалютаИсточник {get;set;}//Валюта - источник
		public decimal/*(15.3)*/ КоличествоИсточник {get;set;}//Количество источник
		public decimal/*(15.3)*/ КоличествоПриемник {get;set;}//Количество источник
		public decimal/*(15.2)*/ Сумма {get;set;}//Сумма (в валюте источника)
		public decimal/*(10.4)*/ КурсИсточник {get;set;}//Курс валюты источника
		public decimal/*(10)*/ КратностьИсточник {get;set;}//Кратность валюты источника
		public V82.Перечисления/*Ссылка*/.СостоянияОбъектов Состояние {get;set;}
		public V82.СправочникиСсылка.Пользователи Ответственный {get;set;}
		///<summary>
		///Любая дополнительная информация
		///</summary>
		public string/*(0)*/ Комментарий {get;set;}
		public V82.СправочникиСсылка.Контрагенты КонтрагентПриемник {get;set;}//Контрагент - приемник
		public object НоменклатураПриемник {get;set;}//Номенклатура - приемник
		public V82.СправочникиСсылка.Валюты ВалютаПриемник {get;set;}//Валюта - приемник
		public decimal/*(10.4)*/ КурсПриемник {get;set;}//Курс валюты приемника
		public decimal/*(10)*/ КратностьПриемник {get;set;}//Кратность валюты приемника
		
		public ВнутреннееПеремещениеСредствПриБюджетировании()
		{
		}
		
		public ВнутреннееПеремещениеСредствПриБюджетировании(byte[] УникальныйИдентификатор)
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_Number [Номер]
					,_Fld3489RRef [Сценарий]
					,_Fld3490 [ПериодПланирования]
					,_Fld3491RRef [СтатьяОборотов]
					,_Fld3492RRef [ЕдиницаИзмеренияИсточник]
					,_Fld3493RRef [ЕдиницаИзмеренияПриемник]
					,_Fld3494RRef [ЦФОИсточник]
					,_Fld3495RRef [ЦФОПриемник]
					,_Fld3496RRef [ПроектИсточник]
					,_Fld3497RRef [ПроектПриемник]
					,_Fld3498RRef [КонтрагентИсточник]
					,_Fld3499_TYPE [НоменклатураИсточник_Тип],_Fld3499_RRRef [НоменклатураИсточник],_Fld3499_RTRef [НоменклатураИсточник_Вид]
					,_Fld3500RRef [ВалютаИсточник]
					,_Fld3501 [КоличествоИсточник]
					,_Fld3502 [КоличествоПриемник]
					,_Fld3503 [Сумма]
					,_Fld3504 [КурсИсточник]
					,_Fld3505 [КратностьИсточник]
					,_Fld3506RRef [Состояние]
					,_Fld3507RRef [Ответственный]
					,_Fld3508 [Комментарий]
					,_Fld3509RRef [КонтрагентПриемник]
					,_Fld3510_TYPE [НоменклатураПриемник_Тип],_Fld3510_RRRef [НоменклатураПриемник],_Fld3510_RTRef [НоменклатураПриемник_Вид]
					,_Fld3511RRef [ВалютаПриемник]
					,_Fld3512 [КурсПриемник]
					,_Fld3513 [КратностьПриемник]
					From _Document230(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Номер = Читалка.GetString(3);
							ПериодПланирования = Читалка.GetDateTime(5);
							КоличествоИсточник = Читалка.GetDecimal(18);
							КоличествоПриемник = Читалка.GetDecimal(19);
							Сумма = Читалка.GetDecimal(20);
							КурсИсточник = Читалка.GetDecimal(21);
							КратностьИсточник = Читалка.GetDecimal(22);
							Состояние = V82.Перечисления/*Ссылка*/.СостоянияОбъектов.ПустаяСсылка.Получить((byte[])Читалка.GetValue(23));
							Комментарий = Читалка.GetString(25);
							КурсПриемник = Читалка.GetDecimal(31);
							КратностьПриемник = Читалка.GetDecimal(32);
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.ДокументыОбъект.ВнутреннееПеремещениеСредствПриБюджетировании  ПолучитьОбъект()
		{
			var Объект = new V82.ДокументыОбъект.ВнутреннееПеремещениеСредствПриБюджетировании();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Номер = Номер;
			Объект.Сценарий = Сценарий;
			Объект.ПериодПланирования = ПериодПланирования;
			Объект.СтатьяОборотов = СтатьяОборотов;
			Объект.ЕдиницаИзмеренияИсточник = ЕдиницаИзмеренияИсточник;
			Объект.ЕдиницаИзмеренияПриемник = ЕдиницаИзмеренияПриемник;
			Объект.ЦФОИсточник = ЦФОИсточник;
			Объект.ЦФОПриемник = ЦФОПриемник;
			Объект.ПроектИсточник = ПроектИсточник;
			Объект.ПроектПриемник = ПроектПриемник;
			Объект.КонтрагентИсточник = КонтрагентИсточник;
			Объект.НоменклатураИсточник = НоменклатураИсточник;
			Объект.ВалютаИсточник = ВалютаИсточник;
			Объект.КоличествоИсточник = КоличествоИсточник;
			Объект.КоличествоПриемник = КоличествоПриемник;
			Объект.Сумма = Сумма;
			Объект.КурсИсточник = КурсИсточник;
			Объект.КратностьИсточник = КратностьИсточник;
			Объект.Состояние = Состояние;
			Объект.Ответственный = Ответственный;
			Объект.Комментарий = Комментарий;
			Объект.КонтрагентПриемник = КонтрагентПриемник;
			Объект.НоменклатураПриемник = НоменклатураПриемник;
			Объект.ВалютаПриемник = ВалютаПриемник;
			Объект.КурсПриемник = КурсПриемник;
			Объект.КратностьПриемник = КратностьПриемник;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.ДокументыСсылка.ВнутреннееПеремещениеСредствПриБюджетировании ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.ДокументыСсылка.ВнутреннееПеремещениеСредствПриБюджетировании)Кэш[УИ];
			}
			var Ссылка = new V82.ДокументыСсылка.ВнутреннееПеремещениеСредствПриБюджетировании(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}